/**
 * 
 */
package ar.edu.utn.frgp.EjemploHibernate.dao.impl;

import java.math.BigInteger;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import ar.edu.utn.frgp.EjemploHibernate.dao.CuentaDao;
import ar.edu.utn.frgp.EjemploHibernate.dao.DefaultGenericDao;
import ar.edu.utn.frgp.EjemploHibernate.model.Cuenta;

/**
 * @author gvolpe
 * 
 *         31/08/2012 12:57:49
 */
public class CuentaDaoImpl extends DefaultGenericDao implements CuentaDao {

	public void create(Cuenta obj) {
		// TODO Auto-generated method stub
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		session.save(obj);
		session.beginTransaction();
	}

	public void update(Cuenta obj) {
		// TODO Auto-generated method stub
		hibernateTemplate.update(obj);

	}

	public void delete(Cuenta obj) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		session.delete(obj);
		session.beginTransaction();
	}

	public List<Cuenta> getAll() {
		return null;
	}

	public Cuenta buscarCuenta(String dni) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		Cuenta cuenta = (Cuenta) session.createCriteria(Cuenta.class)
				.add(Restrictions.idEq(dni)).uniqueResult();
		return cuenta;
	}

	@SuppressWarnings("unchecked")
	public List<Cuenta> getCuentasxDni(String dni) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		List<Cuenta> cuentas = (List<Cuenta>) session
				.createCriteria(Cuenta.class).add(Restrictions.eq("dni", dni))
				.add(Restrictions.eq("estado", "HABILITADA"))
				.addOrder(Order.desc("tipoCuenta"))
				.addOrder(Order.desc("idCuenta")).list();
		return cuentas;
	}

	public int getCantidadCuentaCorriente(String dni) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		BigInteger c;
		c = (BigInteger) session
				.createSQLQuery(
						"select count(idCuenta) from cuenta where dni = '"
								+ dni
								+ "' and tipoCuenta = 'CUENTA CORRIENTE' and estado = 'HABILITADA';")
				.uniqueResult();

		return c.intValue();
	}

	public int getCantidadCajaAhorro(String dni) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		BigInteger c;
		c = (BigInteger) session
				.createSQLQuery(
						"select count(idCuenta) from cuenta where dni = '"
								+ dni
								+ "' and tipoCuenta = 'CAJA DE AHORRO' and estado = 'HABILITADA';")
				.uniqueResult();
		return c.intValue();
	}

	public int getMaxidCuenta() {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		BigInteger c;
		c = (BigInteger) session.createSQLQuery(
				"select count(idCuenta) from cuenta;").uniqueResult();
		return c.intValue();
	}

	public Cuenta getCuenta(int idCuenta) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		Cuenta cuenta = (Cuenta) session.createCriteria(Cuenta.class)
				.add(Restrictions.eq("idCuenta", idCuenta)).uniqueResult();
		return cuenta;
	}

	public void eliminarCuenta(int idCuenta) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		org.hibernate.Query query =  session
				.createQuery("update cuenta set estado = 'DESHABILITADA'"
						+ " where idCuenta = " + idCuenta);
	query.executeUpdate();
	}

}
